package src;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理主题角色：也叫做委托类或代理类。它负责对真实角色的应用，
 * 把所有抽象主题类定义的方法限制委托给真实主题角色实现，并且在具体主题角色处理完毕前后做预处理和善后处理工作。
 */
class JingDongProxy implements InvocationHandler {
    private final String COMMON_PEDDLE = "我是京东的jdk动态代理，";
    private final ISell sell; //真实对象，也就是被代理的的目标对象
    public  JingDongProxy(){
        this.sell = new YonexImplSell();
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
        return COMMON_PEDDLE+method.invoke(sell, args);
    }
}

/**
 * 程序入口，一般为程序的调用者使用代理访问功能
 */
public class DynamicJdkProxy {
    public static void main(String[] args) {
        JingDongProxy jingDongProxy = new JingDongProxy();
        /**
         * @Description Proxy.newProxyInstance 创建代理对象
         *      参数分别为 类加载器、目标类的接口的实现类的所有class数组、代理类的实例化对象
         * @Date 10:31 2022/8/9
         * @Author sunye
         **/
        ISell proxyInstance = (ISell) Proxy.newProxyInstance(jingDongProxy.getClass().getClassLoader(), YonexImplSell.class.getInterfaces(), jingDongProxy);
        System.out.println(proxyInstance.sellGloves());
    }
}
